/** Solve a linear system of equations given by a n&times;n matrix 
    with a result vector n&times;1. */
window.gauss = function(A) {
    var n = A.length;

    for (var i=0; i<n; i++) {
        // Search for maximum in this column
        var maxEl = Math.abs(A[i][i]);
        var maxRow = i;
        for(var k=i+1; k<n; k++) {
            if (Math.abs(A[k][i]) > maxEl) {
                maxEl = Math.abs(A[k][i]);
                maxRow = k;
            }
        }

        // Swap maximum row with current row (column by column)
        for (var k=i; k<n+1; k++) {
            var tmp = A[maxRow][k];
            A[maxRow][k] = A[i][k];
            A[i][k] = tmp;
        }

        // Make all rows below this one 0 in current column
        for (k=i+1; k<n; k++) {
            var c = -A[k][i]/A[i][i];
            for(var j=i; j<n+1; j++) {
                if (i==j) {
                    A[k][j] = 0;
                } else {
                    A[k][j] += c * A[i][j];
                }
            }
        }
    }

    // Solve equation Ax=b for an upper triangular matrix A
    var x= new Array(n);
    for (var i=n-1; i>-1; i--) {
        x[i] = A[i][n]/A[i][i];
        for (var k=i-1; k>-1; k--) {
            A[k][n] -= A[k][i] * x[i];
        }
    }
    return x;
};

window.calc_coefs = function(m)
{
	var pow=Math.pow;
	var mat=[
		//ax^4+bx^3+cx^2+dx+e=y
		//[a0,b0,c0,d0,e0 a1,b1,c1,d1,e0 y]
		//[pow(x,4),pow(x,3),pow(x,2),x,1, 0,0,0,0,0, y] //s0(x)=y
		[0,0,0,0,1,  0,0,0,0,0, 0], //s0(0)=0
		[pow(m/2,4),pow(m/2,3),pow(m/2,2),m/2,1,  0,0,0,0,0, 1], //s0(m/2)=1
		[pow(m,4),pow(m,3),pow(m,2),m,1,  0,0,0,0,0, 0], //s0(m)=0
		//[0,0,0,0,0, pow(x,4),pow(x,3),pow(x,2),x,1, y] //s1(x)=y
		[0,0,0,0,0, pow(m,4),pow(m,3),pow(m,2),m,1, 0], //s1(m)=0
		[0,0,0,0,0, pow(2,4),pow(2,3),pow(2,2),2,1, 0], //s1(2)=0
		[0,0,0,0,0, pow(0.5*m+1,4),pow(0.5*m+1,3),pow(0.5*m+1,2),0.5*m+1,1, -1], //s1(0.5*m+1)=-1
		//4ax^3+3bx^2+2cx+d=y'
		// [4*pow(x,3),3*pow(x,2),2*x,1,0, -4*pow(x,3),-3*pow(x,2),-2*x,-1,0, 0]  //s0'(x1)-s1'(x2) =0
		[4*pow(0,3),3*pow(0,2),2*0,1,0, -4*pow(2,3),-3*pow(2,2),-2*2,-1,0, 0],  //s0'(0)-s1'(2) =0
		[4*pow(m,3),3*pow(m,2),2*m,1,0, -4*pow(m,3),-3*pow(m,2),-2*m,-1,0, 0],  //s0'(m)-s1'(m) =0
		//12ax^2+6bx+2c=y''
		// [12*pow(x,2),6*x,2,0,0, -12*pow(x,2),-6*x,-2,0,0, 0] //s0''(x1)-s1''(x2) =0
		[0,0,2,0,0, -12*pow(2,2),-6*2,-2,0,0, 0], //s0''(0)-s1''(2) =0
		[12*pow(m,2),6*m,2,0,0, -12*pow(m,2),-6*m,-2,0,0, 0] //s0''(m)-s1''(m) =0
	];
	window.coefs = gauss(mat);
};